package com.kurt.repository;

import com.kurt.entity.SysOrganization;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 组织Repository接口
 * 提供组织数据访问方法
 */
@Repository
public interface SysOrganizationRepository extends JpaRepository<SysOrganization, Long>, JpaSpecificationExecutor<SysOrganization> {

    /**
     * 根据父组织ID查找子组织列表
     *
     * @param parentId 父组织ID
     * @return 子组织列表
     */
    List<SysOrganization> findByParentId(Long parentId);

    /**
     * 根据状态查找组织列表
     *
     * @param status 状态
     * @return 组织列表
     */
    List<SysOrganization> findByStatus(Integer status);

    /**
     * 根据组织ID列表查找组织
     *
     * @param organizationIds 组织ID列表
     * @return 组织列表
     */
    List<SysOrganization> findByIdIn(List<Long> organizationIds);

    /**
     * 根据层级查找组织列表
     *
     * @param level 层级
     * @return 组织列表
     */
    List<SysOrganization> findByLevel(Integer level);

    /**
     * 查找根组织（父ID为0）
     *
     * @return 根组织列表
     */
    List<SysOrganization> findByParentIdAndStatus(Long parentId, Integer status);

    /**
     * 根据组织名称查找组织
     *
     * @param name 组织名称
     * @return 组织信息
     */
    Optional<SysOrganization> findByName(String name);

    /**
     * 统计组织下的子组织数量
     *
     * @param parentId 父组织ID
     * @return 子组织数量
     */
    long countByParentId(Long parentId);

    /**
     * 查找组织树（递归查询所有子组织）
     *
     * @param parentId 父组织ID
     * @return 组织树列表
     */
    @Query("SELECT o FROM SysOrganization o WHERE o.parentId = :parentId ORDER BY o.sortOrder ASC")
    List<SysOrganization> findOrganizationTree(@Param("parentId") Long parentId);

    /**
     * 根据父组织ID和状态查询组织列表，按排序号升序
     *
     * @param parentId 父组织ID
     * @param status   状态
     * @return 组织列表
     */
    List<SysOrganization> findByParentIdAndStatusOrderBySortOrderAsc(Long parentId, Integer status);

    /**
     * 根据组织名称和ID查询组织（排除指定ID）
     *
     * @param name 组织名称
     * @param id   排除的组织ID
     * @return 组织
     */
    Optional<SysOrganization> findByNameAndIdNot(String name, Long id);
}
